package com.zhuangjie.shop.vo.order_confirm_require;

import com.zhuangjie.coupon.vo.CouponCoreInfoAndPreferentialAmount;
import com.zhuangjie.coupon.vo.UseCouponCoreInfoContainer;
import com.zhuangjie.order.entity.OrderActivity;
import lombok.Getter;
import lombok.Setter;

import java.math.BigDecimal;
import java.util.List;
import java.util.Objects;

/**
 * 优惠信息
 *
 * @author zhuangjie
 * @date 2024/03/23
 */
@Getter
@Setter
public class PreferentialInfo {
    /**
     * 活动优惠信息-list
     */
    private List<OrderActivity> availableActivityList;
    /**
     * 使用的优惠券信息-{list,list}
     */
    private UseCouponCoreInfoContainer usedCoupons;
    /**
     * 活动优惠金额（包括deliveryFeeDeductionAmount）
     */
    private BigDecimal activityDeductionAmount;
    /**
     * 优惠的配送费金额
     */
    private BigDecimal deliveryFeeDeductionAmount;

    /**
     * 可使用的平台券数量（即使券相同）
     */
    private Integer platformCouponCount;
    /**
     * 可使用的店铺券数量（即使券相同）
     */
    private Integer shopCouponCount;

    /**
     * 可在本菜品订单中可使用的平台券批次
     */
    private List<Long> platformBatchIds;
    /**
     * 可在本菜品订单中可使用的店铺券批次
     */
    private List<Long> shopCouponBatchIds;
    /**
     * `传入要使用的所有店铺券`优惠的金额
     */
    private BigDecimal allShopCouponDeductionAmount;
    /**
     * `传入要使用的所有平台券`优惠的金额
     */
    private BigDecimal allPlatformCouponDeductionAmount;
    /**
     * `活动+优惠券` 优惠的金额
     */
    private BigDecimal activityAndCouponPreferentialAfterOrderAmount;

    /**
     * 计算店铺需要承担的平台优惠券优惠金额
     */
    public BigDecimal calculateShopBearingPlatformCouponDeductionAmount() {
        List<CouponCoreInfoAndPreferentialAmount> usePlatformCouponPreferentialInfoList = usedCoupons.getUsePlatformCouponPreferentialInfoList();
        if (usePlatformCouponPreferentialInfoList == null || usePlatformCouponPreferentialInfoList.isEmpty()) {
            return null;
        }
        return usePlatformCouponPreferentialInfoList.stream()
                .map(couponPreferentialInfo->couponPreferentialInfo.getCouponCoreInfo().getExpansionAmount())
                .filter(Objects::nonNull)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
    }


}
